package com.uy.system.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.uy.system.model.entity.SysDept;
import com.uy.system.mapper.SysDeptMapper;
import com.uy.system.model.vo.SysDeptVO;
import com.uy.system.service.ISysDeptService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.uy.system.utils.BeanUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 部门表 服务实现类
 * </p>
 *
 * @author ly
 * @since 2024-03-22
 */
@Service
public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> implements ISysDeptService {

    @Override
    public List<SysDeptVO> getSysDeptTree() {
        LambdaQueryWrapper<SysDept> lqw = new LambdaQueryWrapper<>();
        lqw.eq(SysDept::getStatus, 0).eq(SysDept::getDelFlag, 0);
        List<SysDept> deptList = baseMapper.selectList(lqw);
        return treeDept(deptList, 0L);
    }

    /**
     * 构建部门树
     * @param deptList 部门全部数据
     * @param root 根节点id
     * @return 树
     */
    public List<SysDeptVO> treeDept(List<SysDept> deptList, Long root){
        List<SysDeptVO> listTree = new ArrayList<>();
        List<SysDeptVO> list = new ArrayList<>();

        Map<Long, List<SysDeptVO>> parentMap = new HashMap<>();
        for (SysDept dept:deptList){
            SysDeptVO vo = BeanUtils.copyProperties(dept, SysDeptVO.class);
            list.add(vo);
            Long parentId = vo.getParentId();
            if(parentId == root){
                listTree.add(vo);
                continue;
            }
            // 如果key不存在，则创建新list并放入数据；key存在，则直接往list放入数据
            parentMap.computeIfAbsent(parentId, key -> new ArrayList<>()).add(vo);
        }

        for (SysDeptVO vo:list){
            vo.setChildren(parentMap.get(vo.getDeptId()));
        }

        return listTree;
    }
}
